package space

import (
	"path"
	"src/zeus/common"
	"src/zeus/logger"
	"src/zeus/pathfinder"
)

// SetMap 设置地图
func (s *Space) SetMap(mapName string) {
	s.MapName = mapName
}

func (s *Space) SetLoadObstacle(loadObstacle int32) {
	s.loadObstacle = loadObstacle
}

func (this *Space) loadFinder() {
	levelPath := path.Join(common.GetResPath(), "maps", this.MapName)
	levelPath = path.Join(levelPath, "level.bin.to")
	this.PathFindermgr = pathfinder.GetMeshMgr().GetFinder(levelPath, this.MapKey)
	this.onLoadMapFinished(this.PathFindermgr != nil)
}

func (s *Space) loadMap() {
	ret := s._loadMap()
	s.onLoadMapFinished(ret)
}

func (s *Space) _loadMap() (ret bool) {

	task := getMapsInst().GetMap(s.MapName, s.loadObstacle)
	// <-task.c

	// //TODO fixme 临时处理
	// //if ret {
	s.MapInfo = task.info
	// //}

	// // task.c <- ret

	return true
}

func (s *Space) onLoadMapFinished(ret bool) {
	im, ok := s.GetRealPtr().(IRealSpace)

	logger.Debugf(logger.LogKey_Space, " onLoadMapFinished %s onMap finished %v ", s, ret)

	if ok {
		if ret {
			im.OnMapLoadSucceed()
		} else {
			im.OnMapLoadFailed()
		}
	}

	s.isMapLoaded = ret
}

// IsMapLoaded 地图是否加载
func (s *Space) IsMapLoaded() bool {
	return s.isMapLoaded
}

//// FindPath 查询一条路径
//func (s *Space) FindPath(srcPos, destPos linmath.Vector3) ([]linmath.Vector3, error) {
//
//	if s.MapInfo == nil {
//		return nil, errors.New("no map info")
//	}
//	return pathfinder.FindPath(srcPos,destPos,s.MapInfo)
//}

// // IsPosValid 查询坐标是否合法
// func (s *Space) IsPosValid(srcPos d3.Vec3) (d3.Vec3, bool) {

// 	if s.MapInfo == nil {
// 		return nil, false
// 	}

// 	filter := detour.NewStandardQueryFilter()
// 	st, ref, pt := s.MapInfo.navmeshQuery.FindNearestPoly(srcPos, d3.NewVec3XYZ(1, 0, 1), filter)
// 	if st != detour.Success || ref == 0 {
// 		return nil, false
// 	}
// 	return pt, true
// }

// // GetRanges 获取区域管理器
// func (s *Space) GetRanges() *MapRanges {
// 	return s.MapInfo.ranges
// }

// // GetHeight 获取高度
// func (s *Space) GetHeight(x, z float32) (float32, error) {
// 	origin := linmath.Vector3{
// 		X: x,
// 		Y: 1000,
// 		Z: z,
// 	}
// 	direction := linmath.Vector3{
// 		X: 0,
// 		Y: -1,
// 		Z: 0,
// 	}
// 	_, pos, _, hit := s.MapInfo.scene.Raycast(origin, direction, 2000, 1<<12)
// 	if hit {
// 		return pos.Y, nil
// 	}
// 	return 0, fmt.Errorf("射线检测失败, 无法获取高度")
// }
